import {randomIntRightOpen_0_n} from "@/num/utils/random-num-util.ts"

/**
 * 由小写字母组成的字符串
 *
 * @type {string}
 */
export const LOWER_CASE_LETTERS = 'abcdefghijklmnopqrstuvwxyz'

/**
 * 由大写字母组成的字符串
 *
 * @type {string}
 */
export const UPPER_CASE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

/**
 * 由数字组成的字符串
 *
 * @type {string}
 */
export const DIGITS = "0123456789"

/**
 * 要生成的随机字符串的类型的字符串名称常量对象
 */
export const RandomStrTypeConst = {
  // 生成由大小写字母和数字组成的随机字符串
  ALL: 'ALL',
  // 生成由小写字母组成的随机字符串
  LOWER_CASE_LETTERS: 'LOWER_CASE_LETTERS',
  // 生成由大写字母组成的随机字符串
  UPPER_CASE_LETTERS: 'UPPER_CASE_LETTERS',
  // 生成由大小写字母组成的随机字符串
  ALL_CASE_LETTERS: 'ALL_CASE_LETTERS',
  // 生成由数字组成的随机字符串
  DIGITS: 'DIGITS',
  // 生成由小写字母和数字组成的随机字符串
  LOWER_CASE_LETTERS_DIGITS: 'LOWER_CASE_LETTERS_DIGITS',
  // 生成由大写字母和数字组成的随机字符串
  UPPER_CASE_LETTERS_DIGITS: 'UPPER_CASE_LETTERS_DIGITS',
} as const

/**
 * 要生成的随机字符串类型
 */
export type RandomStrType = typeof RandomStrTypeConst[keyof typeof RandomStrTypeConst]

/**
 * 生成指定类型和长度的随机字符串<br/>
 *
 * @param {RandomStrTypeEnum} randomStrType 随机字符串类型
 * @param {number} len 随机字符串长度，如果小于等于 0，则直接返回空字符串
 * @returns {string} 指定类型和长度的随机字符串
 */
export const genRandomStr = (randomStrType: RandomStrType, len: number) => {
  if (len <= 0) return '';
  // 存储生成的随机字符串
  let randomStr = '';
  // 用于生成随机字符串的字符集
  let charSet = '';
  // 根据随机字符串类型选择相应的字符集
  switch (randomStrType) {
    case RandomStrTypeConst.ALL:
      charSet = LOWER_CASE_LETTERS + UPPER_CASE_LETTERS + DIGITS;
      break;
    case RandomStrTypeConst.LOWER_CASE_LETTERS:
      charSet = LOWER_CASE_LETTERS;
      break;
    case RandomStrTypeConst.UPPER_CASE_LETTERS:
      charSet = UPPER_CASE_LETTERS;
      break;
    case RandomStrTypeConst.ALL_CASE_LETTERS:
      charSet = LOWER_CASE_LETTERS + UPPER_CASE_LETTERS;
      break;
    case RandomStrTypeConst.DIGITS:
      charSet = DIGITS;
      break;
    case RandomStrTypeConst.LOWER_CASE_LETTERS_DIGITS:
      charSet = LOWER_CASE_LETTERS + DIGITS;
      break;
    case RandomStrTypeConst.UPPER_CASE_LETTERS_DIGITS:
      charSet = UPPER_CASE_LETTERS + DIGITS;
      break;
    default:
      break;
  }
  // 生成随机字符串
  for (let i = 0; i < len; i++) {
    // 从字符集中随机选择一个字符
    randomStr += charSet[randomIntRightOpen_0_n(charSet.length)];
  }
  return randomStr;
}
